package com.sdgakj.utils.tencent;

import com.sdgakj.utils.tencent.business.ScanPayBusiness;
import com.sdgakj.utils.tencent.common.Configure;
import com.sdgakj.utils.tencent.protocol.order_protocol.UnifiedOrderReqData;
import com.sdgakj.utils.tencent.protocol.pay_protocol.ScanPayReqData;
import com.sdgakj.utils.tencent.protocol.pay_query_protocol.ScanPayQueryReqData;
import com.sdgakj.utils.tencent.service.ScanPayQueryService;
import com.sdgakj.utils.tencent.service.ScanPayService;
import com.sdgakj.utils.tencent.service.UnifiedOrderService;

/**
 * SDK总入口
 */
public class WXPay {
    /**
     * 初始化SDK依赖的几个关键配置
     * @param key 签名算法需要用到的秘钥
     * @param appID 公众账号ID
     * @param mchID 商户ID
     * @param sdbMchID 子商户ID，受理模式必填
     * @param certLocalPath HTTP证书在服务器中的路径，用来加载证书用
     * @param certPassword HTTP证书的密码，默认等于MCHID
     */
    public static void initSDKConfiguration(String key,String appID,String mchID,String sdbMchID,String certLocalPath,String certPassword){
        Configure.setKey(key);
        Configure.setAppID(appID);
        Configure.setMchID(mchID);
        Configure.setSubMchID(sdbMchID);
        Configure.setCertLocalPath(certLocalPath);
        Configure.setCertPassword(certPassword);
    }

    /**
     * 请求统一下单服务
     * 
     * @param unifiedOrderReqData 这个数据对象里面包含了API要求提交的各种数据字段
     * @return API返回的数据
     * @throws Exception
     */
    public static String requestUnifiedOrderService(UnifiedOrderReqData unifiedOrderReqData) throws Exception {
        return new UnifiedOrderService().request(unifiedOrderReqData);
    }

    /**
     * 请求支付服务
     * 
     * @param scanPayReqData 这个数据对象里面包含了API要求提交的各种数据字段
     * @return API返回的数据
     * @throws Exception
     */
    public static String requestScanPayService(ScanPayReqData scanPayReqData) throws Exception{
        return new ScanPayService().request(scanPayReqData);
    }

    /**
     * 请求支付查询服务
     * @param scanPayQueryReqData 这个数据对象里面包含了API要求提交的各种数据字段
     * @return API返回的XML数据
     * @throws Exception
     */
	public static String requestScanPayQueryService(ScanPayQueryReqData scanPayQueryReqData) throws Exception{
		return new ScanPayQueryService().request(scanPayQueryReqData);
	}


    /**
     * 直接执行被扫支付业务逻辑（包含最佳实践流程）
     * @param scanPayReqData 这个数据对象里面包含了API要求提交的各种数据字段
     * @param resultListener 商户需要自己监听被扫支付业务逻辑可能触发的各种分支事件，并做好合理的响应处理
     * @throws Exception
     */
    public static void doScanPayBusiness(ScanPayReqData scanPayReqData, ScanPayBusiness.ResultListener resultListener) throws Exception {
        new ScanPayBusiness().run(scanPayReqData, resultListener);
    }

}
